package incoming

import (
	"bytes"
	"encoding/json"
	"fmt"
	"github.com/sirupsen/logrus"
	"io"
	"mime/multipart"
	"net/http"
	"oa-rest/common"
	"time"
)

// UploadDocument 上传收文文档，直接返回AI服务输出结果
func uploadDocument(fileData []byte, fileName string, uploader string, remarks string) (*DocumentInfo, error) {
	logrus.Infof("开始处理文件上传: %s, 上传人: %s", fileName, uploader)

	// 直接调用AI服务解析文档
	docInfo, err := parseDocument(fileData, fileName)
	if err != nil {
		logrus.Errorf("文档解析失败: %v", err)
		return nil, fmt.Errorf("文档解析失败: %w", err)
	}

	logrus.Infof("文档解析成功: %s", fileName)

	return docInfo, nil
}

// DocumentInfo 文档信息
type DocumentInfo struct {
	FileName         string `json:"file_name"`
	FileTitle        string `json:"file_title"`
	FileNumber       string `json:"file_number"`
	FileOrganization string `json:"file_organization"`
	FileDate         string `json:"file_date"`
	UploadTime       string `json:"upload_time"`
}

// parseDocument 调用AI服务解析文档
func parseDocument(fileData []byte, fileName string) (*DocumentInfo, error) {
	// 创建multipart表单数据
	body := &bytes.Buffer{}
	writer := multipart.NewWriter(body)

	// 添加文件字段
	part, err := writer.CreateFormFile("file", fileName)
	if err != nil {
		return nil, fmt.Errorf("创建表单文件失败: %w", err)
	}

	_, err = io.Copy(part, bytes.NewReader(fileData))
	if err != nil {
		return nil, fmt.Errorf("写入文件数据失败: %w", err)
	}

	err = writer.Close()
	if err != nil {
		return nil, fmt.Errorf("关闭表单writer失败: %w", err)
	}

	// 创建HTTP请求
	url := fmt.Sprintf("%s:30063/upload", common.AIHttpClient.BaseURL)
	req, err := http.NewRequest("POST", url, body)
	if err != nil {
		return nil, fmt.Errorf("创建HTTP请求失败: %w", err)
	}

	// 设置请求头
	req.Header.Set("Content-Type", writer.FormDataContentType())
	req.Header.Set("Accept", "application/json")

	// 发送请求
	client := &http.Client{
		Timeout: 120 * time.Second, // 2分钟超时
	}

	resp, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("发送解析请求失败: %w", err)
	}
	defer resp.Body.Close()

	// 检查响应状态码
	if resp.StatusCode != http.StatusOK {
		body, _ := io.ReadAll(resp.Body)
		return nil, fmt.Errorf("文档解析服务返回错误状态码: %d, 响应: %s", resp.StatusCode, string(body))
	}

	// 解析响应
	var result struct {
		Success      bool         `json:"success"`
		Message      string       `json:"message"`
		DocumentID   string       `json:"document_id"`
		DocumentInfo DocumentInfo `json:"document_info"`
	}

	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return nil, fmt.Errorf("解析响应失败: %w", err)
	}

	if !result.Success {
		return nil, fmt.Errorf("文档解析失败: %s", result.Message)
	}

	return &result.DocumentInfo, nil
}
